package com.example.blog.config;


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;


import javax.annotation.Resource;

@Configuration
public class SecurityConfig {
    //开启密文比对
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {

        http //关闭自带的登录设置
                .formLogin().disable()
                //关闭csrf
                .csrf().disable()
                //不通过Session获取SecurityContext
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
                 //允许跨域
                 http.cors();

        return http.build();
    }

    /**
     * AuthenticationConfiguration 这个类的作用就是用来创建ProviderManager，
     * ProviderManager是一个AuthenticationManager(认证管理器)实现，
     * 用于管理所有AuthenticationProvider实现的一个管理器。
     * 简单的说就是：
     * 这里注入·该类，就可以使用AuthenticationManager认证管理，就能获取认证对象的类，我们就可以自定义的认证登录
     * 届时只需将前端传来的 账号以及密码 传入到 AuthenticationManager 那么security就会认证 并返回认证对象
     * 通过判断认证对象是否为空  即可判断是否登录成功
     * 所以 这里主要就是  注入 AuthenticationConfiguration
     */
    @Resource
    private AuthenticationConfiguration authenticationConfiguration;

    /**
     * 上面已经注入AuthenticationConfiguration 所以我们可以创造 AuthenticationManager 认证管理
     * 将该对象造成bean 就可以在自定义登录逻辑中注入使用
     */
    @Bean
    public AuthenticationManager authenticationManager() throws Exception {
        return authenticationConfiguration.getAuthenticationManager();
    }
}